import axios from 'axios';
import { tansParams } from '@/utils';
import { errorCode } from '@/utils/errorCode';
import { LoginStatus, userLoginStore } from '@/stores/login';
import { ElMessage, ElNotification } from 'element-plus';
import { removeToken } from '@/utils/auth';

// 配置请求头
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
// 创建axios实例
export const service = axios.create({
    // axios中请求配置有baseURL选项，表示请求URL公共部分
    baseURL: import.meta.env.VITE_APP_BASE_API,
    // 超时
    timeout: 10000
});
// request拦截器
service.interceptors.request.use(config => {
    // get请求映射params参数
    if (config.method === 'get' && config.params) {
        let url = config.url + '?' + tansParams(config.params);
        url = url.slice(0, -1);
        config.params = {};
        config.url = url;
    }
    return config
}, error => {
      Promise.reject(error)
});
// 响应拦截器
service.interceptors.response.use(res => {
    // 未设置状态码则默认成功状态
    const code = res.status || 200;
    // 获取错误信息
    const msg = errorCode[code] || res.data.msg || errorCode['default']
    // 二进制数据则直接返回
    if(res.request.responseType ===  'blob' || res.request.responseType ===  'arraybuffer'){
        return res.data;
    }
    if (code === 500) {
        ElMessage({
            message: msg,
            type: 'error'
        })
        return Promise.reject(new Error(msg))
    } else if (code !== 200) {
        ElNotification .error({
            title: '提示',
            message: msg
        })
        return Promise.reject('error')
    } else {
        return res.data;
    }
}, error => {
    // 获取登录store
    const loginStore = userLoginStore();
    let message = "";
    if (error.response) {
        // 当服务器返回状态码
        switch (error.response.status) {
            case 401:
                // 移除token信息
                removeToken();
                // 初始化登录状态
                loginStore.loginStatus = LoginStatus.Init;
                // 打开登录框
                loginStore.isShowLoginBox = true;
                // 消息提示
                message = '无效的会话，或者会话已过期，请重新登录。';
                break;
            case 408:
                // 消息提示
                message = "接口请求超时";
                break;
            case 500:
                // 消息提示
                message = "接口连接异常";
                break
            default:
                console.error('Unexpected error:', error.response.status);
        }
        // 错误信息提示
        ElMessage.error(message);
    }
    // 返回错误信息
    return Promise.reject(error);
  }
);